from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.utils.html import format_html

from ..models import Types


# Create your views here.



# 打包函数，获取所有类别
def GetTypesAll():
    '''
    按照顺序获取所有数据
    把数据库中的分类排序完成后发送给前台
    :return:
    '''
    # 旧的写法，但是会导致sql注入攻击
    # typelist = Types.objects.all()  #所有数据对象
    # select * , concat(path,id) as paths from myadmin_types order by paths;

    # django中的写法
    typelist = Types.objects.extra(select={'paths':'concat(path,id)'}).order_by('paths')
    # typelist  按照类型排序后的结果
    # pname 父级类的名称
    for x in typelist:
        # 判断是不是顶级
        if x.pid == 0:
            x.pname = '顶级分类'
        else:
            ob = Types.objects.get(id=x.pid)
            x.pname = ob.name
    return typelist


# 分类的列表
def typesindex(request):
    '''
    10个数据一页,获取前端传送的页码并返回  对应页码的数据(总数据匹配当前页的部分)
    :param request:
    :return:
    '''

    users = GetTypesAll()                     #总对象


    # 数据与搜索匹配
    types = request.GET.get('types', None)
    keywords = request.GET.get('keywords', None)

    if types:
        # 判断是否有搜索条件
        if types == 'all':
            from django.db.models import Q
            # 从所有类别中选择关键字，因此需要用每个字段去分别匹配    'users'   删选后符合条件的对象
            users = users.filter(
                Q(name__contains=keywords) | Q(pid__contains=keywords) | Q(path__contains=keywords))
        else:
            # 通过拼接字符串达到上上行的效果
            data = {types + '__contains': keywords}
            users = users.filter(**data)
    for i in users:
        father_id = i.path.split(',')[-2]
        obj = Types.objects.filter(id=father_id)
        for j in obj:
                i.father = j.name
        if father_id == '0':
            i.father = '顶级'





    # 数据分页
    from django.core.paginator import Paginator
    # 实例化分页对象p,每页10个
    p = Paginator(users, 10)            #删选后的对象进行分组后 符合页码条件的对象
    # 当前页码page,如果不存在则返回1
    page = request.GET.get('page', 1)
    # 当前页面数据
    userlist = p.page(page)
    # 获取所有页码列表
    # pages = p.page_range
    # 分配数据
    context = {'users': userlist}

    # 加载模板
    return render(request, 'myadmin/types/index.html', context)




# 数据添加
def typesadd(request):
    # models拿数据
    context = {'typelist':GetTypesAll}
    # 数据传送给前台
    return render(request,'myadmin/types/add.html',context)

# 更新
def typesupdate(request):
    # 用id获取对象;
    ob = Types.objects.get(id=request.GET['id'])
    # 修改相应的name名称
    ob.name = request.GET['name']
    ob.save()
    return JsonResponse({'error':0,'msg':'更新成功'})
# 删除
def typesdelete(request):
    # 通过id获取对象
    ob = Types.objects.get(id=request.GET['id'])

    # 判断对象是否有子类,有则不删除,无则删除
    if Types.objects.filter(pid=ob.id).count():
        # 如果return返回后就不会执行下面的步骤了,所以删除成功和删除失败不会冲突
        return JsonResponse({'error':1,'msg':'存在子类,无法删除'})
    ob.delete()
    return JsonResponse({'error':0,'msg':'删除成功'})

def typesinsert(request):
    '''
    接受前台传来的数据,把输入写入数据库;
    pid字段需要自己拼接;子path = 父path + 子 pid
    :param request:
    :return:
    '''

    data = request.POST.dict()
    # 接受的数据删除用于加密的无用字段
    data.pop('csrfmiddlewaretoken')
    # 数据为顶级,path不需要拼接;数据非顶级,path需要拼接
    if data['pid'] == '0':
        data['path'] = '0,'
    else:
        # 父级对象(id为子集的pid)
        ob = Types.objects.get(id = data['pid'])
        # 生成自己的path
        data['path'] = ob.path + data['pid'] + ','
    # 创建对象(通过实例化模型,并且给属性和值来实例化数据库对象)
    ob = Types.objects.create(**data)
    # 跳转到列表页
    return HttpResponse('<script>alert("添加成功");location.href="/myadmin/types/index/"</script>')



























































